package com.vf.admin.client.service.impl;

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import com.vf.admin.client.dao.AppMingxiChongzhiDao;
import com.vf.admin.client.dao.AppOrderDao;
import com.vf.admin.client.dao.AppSetupDao;
import com.vf.admin.client.dao.AppUserDao;
import com.vf.admin.client.service.ApiAlipayService;
import com.vf.admin.client.service.pay.AppPaySetupLoadBalancer;
import com.vf.admin.common.Constants;
import com.vf.admin.miaodong.entity.*;
import com.vf.admin.utils.pay.ApiAliPay.AlipayConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.math.BigDecimal;
import java.util.Date;

import static com.vf.admin.utils.RandomUtil.getOrderIdByUUId;

/**
 * 支付宝充值
 */
@Service
public class ApiAlipayServiceImpl implements ApiAlipayService {
    @Autowired
    private AppSetupDao appSetupDao;
    @Autowired
    private AppUserDao appUserDao;
    @Autowired
    private AppOrderDao appOrderDao;

    @Autowired
    private AppMingxiChongzhiDao appMingxiChongzhiDao;

    @Autowired
    private AppPaySetupLoadBalancer appPaySetupLoadBalancer;

    private AlipayConfig alipayConfig;

    /**
     * 支付宝支付宝预下单
     *
     * @param user 充值用户
     * @return
     */
    @Override
    public String diamondRechargeAlipay(AppUser user, AppCzMoney czMoney) {
        //添加订单记录
        AppOrder appOrder = new AppOrder();
        appOrder.setCreatetime(new Date());
        appOrder.setOrdernum(getOrderIdByUUId());//生成订单号
        appOrder.setCzMoneyId(czMoney.getId());
        appOrder.setMoney(new BigDecimal(czMoney.getMoney()));
        appOrder.setStatus(Constants.dingdan_status_dfk);//默认 1、代付款
        appOrder.setType(Constants.dingdan_zhiFuLeiXing_zfb);    //订单支付类型  默认 1、支付宝

        //下单人信息
        appOrder.setUserid(user.getId());
        appOrder.setPic(user.getPic());
        appOrder.setNick(user.getNick());
        appOrder.setPhone(user.getLoginname());
        AppSetup setup = appSetupDao.get();  //获取配置
        appOrder.setNum(czMoney.getDiamonds().add(czMoney.getGive()));
        appOrderDao.save(appOrder);
        //***************** 支付宝预处理 **********************
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); //SDK已经封装掉了公共参数，这里只需要传入业务参数。以下方法为sdk的model入参方式
        model.setBody("充值");//对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。
        model.setSubject("钻石充值");//商品名称
        model.setOutTradeNo(appOrder.getOrdernum()); //商户订单号(自动生成)
        model.setTotalAmount(new BigDecimal(czMoney.getMoney()).setScale(2, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString());//支付金额
        //model.setTotalAmount("0.01");
        model.setProductCode("QUICK_MSECURITY_PAY");//销售产品码（固定值）
        AppPaySetup appPaySetup = appPaySetupLoadBalancer.getNextAlipayAppPaySetup();

        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.app.pay
        AlipayTradeAppPayRequest aliRequest = new AlipayTradeAppPayRequest();
        aliRequest.setBizModel(model);
        aliRequest.setNotifyUrl(appPaySetup.getNotifyUrl());//异步回调地址（后台）

        //返回支付宝订单信息(预处理)
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.GATEWAYURL,
                appPaySetup.getAppId(), appPaySetup.getAppPrivateKey(),
                AlipayConfig.FORMAT, AlipayConfig.CHARSET, appPaySetup.getAlipayPublicKey(),
                AlipayConfig.SIGN_TYPE);
        String orderString = "";
        try {
            AlipayTradeAppPayResponse alipayTradeAppPayResponse = alipayClient.sdkExecute(aliRequest);
            orderString = alipayTradeAppPayResponse.getBody();
        } catch (Exception e) {
            return orderString;
        }
        return orderString;
    }

    /**
     * 支付宝回调
     *
     * @param outTradeNo 平台自定义订单号
     * @param totalFee   实际支付金额
     * @param appOrder   订单对象
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean notifyUrl(String outTradeNo, Double totalFee, AppOrder appOrder) {
        try {
            if (totalFee == null || totalFee.doubleValue() <= 0) {
//                AlipayConfigs alipayConfigs;
//                alipayConfigs aaa =   alipayConfigs.getId(12);
                return false;
            }
            if (appOrder == null || appOrder.getId() == null || appOrder.getId() <= 0) {//支付失败！
                return false;
            }
            if (appOrder.getStatus() == Constants.dingdan_status_yfk) {//订单已支付，直接返回已支付成功
                return true;
            }
            //订单待支付，直接进行订单处理
            if (appOrder.getStatus() == Constants.dingdan_status_dfk) {
                //获取下单人用户信息
                AppUser appUser = appUserDao.get(appOrder.getUserid());
                if (appUser == null || appUser.getId() == null || appUser.getId() <= 0) {
                    return false;
                }
                //查询配置的充值比例
                AppSetup appSetup = appSetupDao.get();
                //根据充值金额和配置的充值比例算出钻石数量
                BigDecimal zuanShi = new BigDecimal(totalFee * appSetup.getRechargeratio());
                if (zuanShi.compareTo(BigDecimal.ZERO) <= 0) {
                    return false;
                }
                //更新订单回调金额
                appOrderDao.updateHuiDiaoJine(new BigDecimal(String.valueOf(totalFee)), outTradeNo, appOrder.getId());
                //更新订单状态为已支付
                appOrderDao.updateStastusYzf(outTradeNo, appOrder.getId());
                //增加充值记录
                AppMingxiChongzhi appMingxiChongzhi = new AppMingxiChongzhi();
                appMingxiChongzhi.setUserid(appUser.getId());/*用户id*/
                appMingxiChongzhi.setPic(appUser.getPic());//用户头像
                appMingxiChongzhi.setNick(appUser.getNick());//用户昵称
                appMingxiChongzhi.setPhone(appUser.getLoginname());//用户手机号
                appMingxiChongzhi.setLeixing(Constants.dingdan_zhiFuLeiXing_zfb);//充值类型： 1、支付宝
                appMingxiChongzhi.setGoumainum(zuanShi);// 钻石数量
                appMingxiChongzhi.setOrdernum(appOrder.getOrdernum());//充值订单号
                appMingxiChongzhi.setCreatetime(new Date());//充值时间
                appMingxiChongzhi.setMoney(new BigDecimal(String.valueOf(totalFee)));
                appMingxiChongzhiDao.save(appMingxiChongzhi);
                //更新增加用户钻石余额
                appUserDao.updateZuanShi(appUser.getId(), new BigDecimal(String.valueOf(zuanShi)));
                return true;
            } else {
                return false;
            }
        } catch (Exception r) {
            //导入失败  事务回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return false;
        }
    }

    /**
     * 支付宝支付宝预下单h5
     *
     * @param user 充值用户
     * @return
     */
    @Override
    public String diamondRechargeAlipayByWeb(AppUser user, AppCzMoney czMoney) {
        //添加订单记录
        AppOrder appOrder = new AppOrder();
        appOrder.setCreatetime(new Date());
        appOrder.setOrdernum(getOrderIdByUUId());//生成订单号
        appOrder.setCzMoneyId(czMoney.getId());
        appOrder.setMoney(new BigDecimal(czMoney.getMoney()));
        appOrder.setStatus(Constants.dingdan_status_dfk);//默认 1、代付款
        appOrder.setType(Constants.dingdan_zhiFuLeiXing_zfb);    //订单支付类型  默认 1、支付宝
        appOrder.setUserid(user.getId());
        appOrder.setPic(user.getPic());
        appOrder.setNick(user.getNick());
        appOrder.setPhone(user.getLoginname());
        appOrder.setNum(czMoney.getDiamonds().add(czMoney.getGive()));
        appOrderDao.save(appOrder);

        //获取配置信息
        AppPaySetup appPaySetup = appPaySetupLoadBalancer.getNextAlipayAppPaySetup();

        //***************** 支付宝预处理 **********************
        AlipayTradeWapPayModel model = new AlipayTradeWapPayModel(); //SDK已经封装掉了公共参数，这里只需要传入业务参数。以下方法为sdk的model入参方式
        model.setOutTradeNo(appOrder.getOrdernum()); //商户订单号，需保证在商家系统中唯一（自动生成）
        model.setSubject("钻石充值");//商品的标题/交易标题/订单标题/订单关键字等。不可使用特殊字符，如 /,=,& 等。
//        model.setTotalAmount(new BigDecimal(czMoney.getMoney()).setScale(2, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString());//订单金额。
        model.setTotalAmount("0.01");//订单金额。 （测试）
        model.setProductCode("QUICK_WAP_PAY");//销售产品码（固定值）
        model.setQuitUrl(appPaySetup.getQuitUrl());//用户付款中途退出返回商户网站的地址

        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.app.pay
        AlipayTradeWapPayRequest webRequest = new AlipayTradeWapPayRequest();
        webRequest.setReturnUrl(appPaySetup.getReturnUrl());//支付成功后点击完成会自动跳转回商家页面地址， 同时在 URL 地址上附带支付结果参数，回跳参数可查看本文 附录 > 前台回跳参数说明。在 iOS 系统中，唤起支付宝客户端支付完成后，不会自动回到浏览器或商家 App。用户可手工切回到浏览器或商家 App。
        webRequest.setNotifyUrl(appPaySetup.getNotifyUrl());//异步通知地址，用于接收支付宝推送给商户的支付/退款成功的消息。（后台）
        webRequest.setBizModel(model);//数据封装

        //返回支付宝订单信息(预处理)
        AlipayClient alipayClient = new DefaultAlipayClient(
                AlipayConfig.GATEWAYURL,
                appPaySetup.getAppId(),
                appPaySetup.getAppPrivateKey(),
                AlipayConfig.FORMAT,
                AlipayConfig.CHARSET,
                appPaySetup.getAlipayPublicKey(),
                AlipayConfig.SIGN_TYPE);
        String orderString = "";
        try {
            orderString = alipayClient.pageExecute(webRequest, "get").getBody();
        } catch (Exception e) {
            return orderString;
        }
        return orderString;
    }

//    /**
//     * 支付宝支付宝预下单h5
//     *
//     * @param user 充值用户
//     * @return
//     */
//    @Override
//    public String diamondRechargeAlipayByWeb(AppUser user, AppCzMoney czMoney) {
//        //添加订单记录
//        AppOrder appOrder = new AppOrder();
//        appOrder.setCreatetime(new Date());
//        appOrder.setOrdernum(getOrderIdByUUId());//生成订单号
//        appOrder.setCzMoneyId(czMoney.getId());
//        appOrder.setMoney(new BigDecimal(czMoney.getMoney()));
//        appOrder.setStatus(Constants.dingdan_status_dfk);//默认 1、代付款
//        appOrder.setType(Constants.dingdan_zhiFuLeiXing_zfb);    //订单支付类型  默认 1、支付宝
//        appOrder.setUserid(user.getId());
//        appOrder.setPic(user.getPic());
//        appOrder.setNick(user.getNick());
//        appOrder.setPhone(user.getLoginname());
//        appOrder.setNum(czMoney.getDiamonds().add(czMoney.getGive()));
//        appOrderDao.save(appOrder);
//
//        //***************** 支付宝预处理 **********************
//        AlipayTradeWapPayModel model = new AlipayTradeWapPayModel(); //SDK已经封装掉了公共参数，这里只需要传入业务参数。以下方法为sdk的model入参方式
//        model.setOutTradeNo(appOrder.getOrdernum()); //商户订单号，需保证在商家系统中唯一（自动生成）
//        model.setSubject("钻石充值");//商品的标题/交易标题/订单标题/订单关键字等。不可使用特殊字符，如 /,=,& 等。
//        model.setBody("充值");//对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。
//
//
////        model.setTotalAmount(new BigDecimal(czMoney.getMoney()).setScale(2, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString());//支付金额
//        model.setTotalAmount("0.01");//支付金额
//        model.setProductCode("QUICK_WAP_PAY");//销售产品码（固定值）
//
//        AppPaySetup appPaySetup = appPaySetupLoadBalancer.getNextAlipayAppPaySetup();
//
//        model.setQuitUrl(appPaySetup.getQuitUrl());
//
//        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.app.pay
//        AlipayTradeWapPayRequest webRequest = new AlipayTradeWapPayRequest();
//        webRequest.setBizModel(model);
//        webRequest.setNotifyUrl(appPaySetup.getNotifyUrl());//异步回调地址（后台）
//        webRequest.setReturnUrl(appPaySetup.getReturnUrl());
//
//        //返回支付宝订单信息(预处理)
//        AlipayClient alipayClient = new DefaultAlipayClient(
//                AlipayConfig.GATEWAYURL,
//                appPaySetup.getAppId(),
//                appPaySetup.getAppPrivateKey(),
//                AlipayConfig.FORMAT,
//                AlipayConfig.CHARSET,
//                appPaySetup.getAlipayPublicKey(),
//                AlipayConfig.SIGN_TYPE);
//        String orderString = "";
//        try {
//            orderString = alipayClient.pageExecute(webRequest, "get").getBody();
////             AlipayTradeWapPayResponse response = alipayClient.pageExecute(webRequest, "get");
//        } catch (Exception e) {
//            return orderString;
//        }
//        return orderString;
//    }


}
